package model;

import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.Calendar;
import java.util.Vector;

import data.AdmPersistDetalleDeuda;

public class DetalleDeuda {
	
	private int numero;
	private Calendar fecha;
	private BigDecimal interes;
	private Departamento departamento;
	private Vector<ItemsDetalleDeuda> items;
	
	public DetalleDeuda(int numero, Calendar fecha, BigDecimal interes, Departamento departamento){
		this.numero=numero;
		this.fecha=fecha;
		this.interes=interes;
		this.departamento=departamento;		
		items=new Vector<ItemsDetalleDeuda>();
	}
	
	public Vector<Vector<String>> obtenerDatos(Vector<ReciboPagoExpensas> recibos, Vector<LiquidacionExpensas> liq){
		Vector<Vector<String>> result = new Vector<Vector<String>>();
		
		for(int i=0;i<items.size();i++){
			Vector<String> item = new Vector<String>();
			NumberFormat nf = NumberFormat.getInstance();
			nf.setMaximumFractionDigits(2);
			
			item.add(String.valueOf((items.elementAt(i).getPeriodo().get(Calendar.YEAR))+"-"+(items.elementAt(i).getPeriodo().get(Calendar.MONTH)+1)+"-"+items.elementAt(i).getPeriodo().get(Calendar.DATE)));
			item.add(items.elementAt(i).getConcepto());	
			item.add(String.valueOf(nf.format(items.elementAt(i).getMonto())));	
						
			result.add(item);
		}
		
		return result;
	}
	
	public void generarItemsDetalleDeuda(Vector<ReciboPagoExpensas> recibos, Vector<LiquidacionExpensas> liq){		
		for(int i=0;i<liq.size();i++){
			LiquidacionExpensas l = liq.elementAt(i);
			Vector<ReciboPagoExpensas> r = this.matchLiqRecibo(l,recibos);			
			
			float totalInteres = this.totalLiqInteres(l,r);
			//si no existen recibos de pago, quiere decir q no se pago nada todavia.
			if (totalInteres>0){
				//(l.getTotal() * departamento.getPorcentaje())-this.calcularMontoRecibos(this.matchLiqRecibo(l,r))
				ItemsDetalleDeuda item = new ItemsDetalleDeuda(l.getFecha(),"Expensas impagas",totalInteres);
				items.add(item);
			}
			else{
				//condicion por si se pago mas que el monto req. Se crea un item con el excedente.				
				if(totalInteres<0){
					ItemsDetalleDeuda item = new ItemsDetalleDeuda(l.getFecha(),"Expensas con excedente",totalInteres);
					items.add(item);
				}
			}
		}
	}
		
	private float totalLiqInteres(LiquidacionExpensas l, Vector<ReciboPagoExpensas> r){
		float total = 0;
		total = l.getTotal() * departamento.getPorcentaje();
		
		Vector<ReciboPagoExpensas> recibosMes = new Vector<ReciboPagoExpensas>();
		
		for (int i = l.getFecha().get(Calendar.MONTH); i <= Calendar.getInstance().get(Calendar.MONTH); i++) {		
			recibosMes.clear();
			
			// busco si hay uno o varios recibos pertenecientes a este mes (i)
			for (int j = 0; j < r.size(); j++) {
				if (r.elementAt(j).getFecha().get(Calendar.MONTH) == i) {
					recibosMes.add(r.elementAt(j));
				}
			}
			// si no hay recibo, le sumo el interes
			if (recibosMes.isEmpty()) {
				if(l.getFecha().get(Calendar.MONTH)==Calendar.getInstance().get(Calendar.MONTH)){
					return total;
				}
				else{
					total *= (1 + interes.floatValue());
				}				
			}
			// sino, descuento el importe q pago y m fijo si pago todo o le
			// queda por pagar
			else {
				float monto = this.calcularMontoRecibos(recibosMes);
				
				if(l.getFecha().get(Calendar.MONTH)==Calendar.getInstance().get(Calendar.MONTH)){
					if (monto < total) {
						total -= monto;
					} else {					
						return total -= monto;
					}
				}
				else{
					if (monto < total) {
						total -= monto;
						total *= (1 + interes.floatValue());
					} else {					
						return total -= monto;
					}
				}				
			}
		}

		return total;
	}
	
	private float calcularMontoRecibos (Vector<ReciboPagoExpensas> r){
		float monto = 0;
		
		for(int i=0;i<r.size();i++){
			monto += r.elementAt(i).getMonto();
		}
		
		return monto;
	}
	
	public float getTotal(){
		float total = 0;			
		
		for(int i=0;i<items.size();i++){
			total += items.elementAt(i).getMonto();			
		}
		
		return total;
	}	
	
	private Vector<ReciboPagoExpensas> matchLiqRecibo (LiquidacionExpensas liq,Vector<ReciboPagoExpensas> recibos){		
		Vector<ReciboPagoExpensas> r = new Vector<ReciboPagoExpensas>();
		
		for(int i=0;i<recibos.size();i++){		
			ReciboPagoExpensas recibo = recibos.elementAt(i);
			if(recibo.getLiquidacionExpensas().getNumero()==liq.getNumero()){
				r.add(recibo);
			}
		}
		
		return r;	
	}
	
	private LiquidacionExpensas matchLiqFecha (Vector<LiquidacionExpensas> liq, Calendar fecha){	
		for(int i=0;i<liq.size();i++){	
			if(liq.elementAt(i).getFecha().get(Calendar.MONTH)==fecha.get(Calendar.MONTH)){
				return liq.elementAt(i);
			}
		}
		
		return null;	
	}
			
	public void persistir(Consorcio consorcio){
		AdmPersistDetalleDeuda.getInstancia().insert(this, consorcio);
	}

	public Calendar getFecha() {
		return fecha;
	}

	public BigDecimal getInteres() {
		return interes;
	}

	public Departamento getDepartamento() {
		return departamento;
	}

	public Vector<ItemsDetalleDeuda> getItems() {
		return items;
	}

	public int getNumero() {
		return numero;
	}
	public void agregarItem(Calendar periodo, String concepto, float monto){
		ItemsDetalleDeuda nuevo = new ItemsDetalleDeuda(periodo, concepto, monto);
		this.items.add(nuevo);
	}
	
	
}
